package com.cencat.common.security;

import com.cencat.common.utils.JwtUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * JWT令牌提供者
 * 提供JWT令牌的生成、验证和解析功能
 * 
 * @author cencat
 * @since 2024-01-01
 */
@Component

public class JwtTokenProvider {

    private static final Logger log = LoggerFactory.getLogger(JwtTokenProvider.class);

    /**
     * 生成访问令牌
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param tenantId 租户ID
     * @param roles 用户角色
     * @return JWT令牌
     */
    public String generateAccessToken(Long userId, String username, Long tenantId, String roles) {
        return JwtUtils.generateAccessToken(userId, username, tenantId, roles);
    }

    /**
     * 生成刷新令牌
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param tenantId 租户ID
     * @param roles 用户角色
     * @return JWT令牌
     */
    public String generateRefreshToken(Long userId, String username, Long tenantId, String roles) {
        return JwtUtils.generateRefreshToken(userId, username, tenantId, roles);
    }

    /**
     * 生成令牌对
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param tenantId 租户ID
     * @param roles 用户角色
     * @return 令牌对
     */
    public JwtUtils.TokenPair generateTokenPair(Long userId, String username, Long tenantId, String roles) {
        return JwtUtils.generateTokenPair(userId, username, tenantId, roles);
    }

    /**
     * 验证JWT令牌
     * 
     * @param token JWT令牌
     * @return 是否有效
     */
    public boolean validateToken(String token) {
        return JwtUtils.validateToken(token);
    }

    /**
     * 解析JWT令牌
     * 
     * @param token JWT令牌
     * @return 令牌信息
     */
    public JwtUtils.JwtTokenInfo parseToken(String token) {
        return JwtUtils.parseToken(token);
    }

    /**
     * 从令牌中提取用户ID
     * 
     * @param token JWT令牌
     * @return 用户ID
     */
    public Long extractUserId(String token) {
        return JwtUtils.extractUserId(token);
    }

    /**
     * 从令牌中提取用户名
     * 
     * @param token JWT令牌
     * @return 用户名
     */
    public String extractUsername(String token) {
        return JwtUtils.extractUsername(token);
    }

    /**
     * 从令牌中提取租户ID
     * 
     * @param token JWT令牌
     * @return 租户ID
     */
    public Long extractTenantId(String token) {
        return JwtUtils.extractTenantId(token);
    }

    /**
     * 检查令牌是否过期
     * 
     * @param token JWT令牌
     * @return 是否过期
     */
    public boolean isTokenExpired(String token) {
        try {
            JwtUtils.JwtTokenInfo tokenInfo = parseToken(token);
            return tokenInfo.isExpired();
        } catch (Exception e) {
            log.warn("检查令牌过期状态失败: {}", e.getMessage());
            return true;
        }
    }

    /**
     * 获取令牌过期时间
     * 
     * @param token JWT令牌
     * @return 过期时间
     */
    public Date getExpirationDate(String token) {
        try {
            JwtUtils.JwtTokenInfo tokenInfo = parseToken(token);
            return tokenInfo.getExpiration();
        } catch (Exception e) {
            log.warn("获取令牌过期时间失败: {}", e.getMessage());
            return null;
        }
    }

    /**
     * 刷新访问令牌
     * 
     * @param refreshToken 刷新令牌
     * @return 新的访问令牌
     */
    public String refreshAccessToken(String refreshToken) {
        return JwtUtils.refreshAccessToken(refreshToken);
    }
}